<?php

App::uses('AppModel', 'Model');

class Conductor extends AppModel {
    /**
     *         MODEL DATA MEMBERS
     */

    /**
     * Nombre de la tabla en base de datos
     *
     * Tabla relacionada con el modelo en cuestión, este atributo será usado para la generación
     * de consultas a la base de datos
     *
     * @var string
     */
    public $useTable = "conductores";

    /**
     * Clave primaria de la base de datos
     *
     * clave primaria que indentifica cada registro de la tabla en cuestión
     *
     * @var string
     */
    public $primaryKey = "id_conductor";

    /**
     * Nombre del campo que se muestra cuando se hacen busquedas del modelo
     *
     * Nombre del campo que se muestra cuando se hacen busquedas del modelo
     *
     * @var string
     */
    public $displayField = "nombre_conductor";

    /**
     * Nivel de recusividad para la busqueda de entidades relacionadas
     *
     * Este campo sirve para indicar si una consulta debe incluir las entidades
     * relacionadas con el modelo en cuestión, -1 quiere decir, 0 q.. y 1 ..
     *
     * @var int
     */
    public $recursive = -1;

    /**
     * Nombre del modelo
     *
     * Nombre del modelo para un alias las consultas y busquedas, ingresos y
     * otras interacciones con la base de datos.
     *
     * @var string
     */
    public $name = "Conductor";

    /**
     * Orden por defecto
     *
     * Orden por defecto para las consultas que se realicen a la base de datos,
     * se pueden incluir varios campos de la base de datos. Y si se especifica
     * otro orden este no se tiene en cuenta.
     *
     * @var array(string)
     */
    public $order = array("Conductor.nombre_conductor", "Conductor.identificacion_conductor");
    public $hasMany = array(
        "Recorrido" => array(
            "className" => "Conductor",
            "foreignKey" => "id_recorrido_realizado",
        ),
    );

    /**
     * Validaciones del modelo
     *
     * Validaciones de los diferentes campos que se usan en el modelo
     *
     * @var array(array(string))
     */
    public $validate = array(
        "id_conductor" => array(
            "notEmpty" => array(
                "rule" => "notEmpty",
                "allowEmpty" => false,
                "required" => "update",
                "message" => "Id del conductor no puede estar vacio",
            ),
            "naturalNumber_NoZero" => array(
                "rule" => array("naturalNumber", false),
                "message" => "Id del conductor debe ser un número entero diferente de cero",
            ),
            "isUnique" => array(
                "rule" => array("isUnique"),
                "message" => "Id del conductor debe ser único",
            ),
        ),
        "nombre_conductor" => array(
            'notEmpty' => array(
                'rule' => 'notEmpty',
                'message' => 'debe ingresar un nombre de conductor',
                "allowEmpty" => false,
                "required" => true
            ),
            'maxLength' => array(
                'rule' => array('maxLength', 30),
                'message' => 'la máxima longitud del nombre de conductor es de 30 caracteres'
            )
        ),
        "identificacion_conductor" => array(
            "notEmpty" => array(
                "rule" => "notEmpty",
                "allowEmpty" => false,
                "required" => true,
                "message" => "La identificación del conductor no puede estar vacia",
            ),
            "maxLength" => array(
                "rule" => array("maxLength", 30),
                "message" => "La identificación del conductor solo puede tener maximo 30 caracteres",
            ),
        ),
        "estado_conductor" => array(
            "notEmpty" => array(
                "rule" => "notEmpty",
                "allowEmpty" => false,
                "required" => true,
                "message" => "Estado no puede estar vacio",
            ),
            "inList" => array(
                "rule" => array("inList", array("activo", "inactivo")),
                "message" => "El estado solo puede ser activo/inactivo",
            ),
        ),
        "fecha_creacion_conductor" => array(
            "notEmpty" => array(
                "rule" => "notEmpty",
                'required' => "create",
                "allowEmpty" => false,
                "message" => "La fecha de creación del conductor no puede estar vacia",
            ),
            "datetime" => array(
                "rule" => array('datetime', 'ymd'),
                "message" => "La fecha de creación del conductor debe ser en formato yyyy/mm/dd",
            ),
        ),
        "fecha_modificacion_conductor" => array(
            "notEmpty" => array(
                "rule" => "notEmpty",
                "allowEmpty" => false,
                "required" => true,
                "message" => "La fecha de modificacion del conductor no puede estar vacia",
            ),
            "datetime" => array(
                "rule" => array('datetime', 'ymd'),
                "message" => "La fecha de modificacion del conductor debe ser en formato yyyy/mm/dd",
            ),
        ),
        "usuario_conductor" => array(
            "notEmpty" => array(
                "rule" => "notEmpty",
                "allowEmpty" => false,
                "required" => true,
                "message" => "Usuario del conductor no puede estar vacio",
            ),
            "maxLength" => array(
                "rule" => array("maxLength", 30),
                "message" => "Usuario del conductor solo puede tener maximo 30 caracteres",
            ),
        ),
        "clave_conductor" => array(
            "notEmpty" => array(
                "rule" => "notEmpty",
                "allowEmpty" => false,
                "required" => false,
                "message" => "Clave del conductor no puede estar vacio",
            ),
            "maxLength" => array(
                "rule" => array("maxLength", 32),
                "message" => "Clave del conductor solo puede tener maximo 32 caracteres",
            ),
        ),
        "fecha_ultima_sesion_conductor" => array(
            "datetime" => array(
                "rule" => array('datetime', 'ymd'),
                "message" => "La fecha de último inicio de sesión del conductor debe ser en formato yyyy/mm/dd",
            ),
        ),
        "hash_sesion_conductor" => array(
            "maxLength" => array(
                "rule" => array("maxLength", 32),
                "message" => "El Hash de la sesión del conductor solo puede tener maximo 32 caracteres",
            ),
        ),
    );

    /**
     *         MODEL METHODS
     */

    /**
     * Funcion save
     *
     * Permite asignar el valor de las fechas de creacion y modificacion,
     * en caso de la fecha de creacion revisa si ya tiene un valor en $data
     * y eso evita que se le vuelva a asignar la fecha actual.
     * @var string
     */
    public function save($data = null, $validate = true, $fieldList = array()) {
        $this->set($data);
        if (!isset($data['Conductor']['id_conductor'])) {
            $this->set(array('fecha_creacion_conductor' => date("Y/m/j H:i:s")));
            $this->set(array('estado_conductor' => "activo"));
        }
        if (!isset($data['Conductor']['estado_conductor'])) {
            $this->set(array('estado_conductor' => 'activo'));
        }
        $this->set(array('fecha_modificacion_conductor' => date("Y/m/j H:i:s")));
        if (isset($this->data['Conductor']['clave_conductor'])) {
            $this->data['Conductor']['clave_conductor'] = md5($this->data['Conductor']['clave_conductor']);
        }
        return parent::save($this->data, $validate, $fieldList);
    }

    public function login($user = array()) {
        if (empty($user) && !isset($user['usuario']) && !isset($user['clave']) && !isset($user['placa'])) {
            return 0;
        }

        $realUser = $this->find('first', array(
            'conditions' => array(
                'Conductor.estado_conductor' => 'activo',
                'Conductor.usuario_conductor' => $user['usuario'],
                'Conductor.clave_conductor' => md5($user['clave']),
            ),
        ));
        $Bus = ClassRegistry::init('Bus');
        $realBus = $Bus->find('first', array(
            'conditions' => array(
                'Bus.placa' =>
                $user['placa'],
            ),
        ));

        if (!empty($realUser) && !empty($realBus)) {
            $realUser['Conductor']['clave_conductor'] = $user['clave'];
            $realUser['Conductor']['fecha_ultima_sesion_conductor'] = date("Y/m/j H:i:s");
            $realUser['Conductor']['hash_sesion_conductor'] = md5(CakeSession::read("Config.userAgent") . CakeSession::read("Config.time"));
            if ($this->save($realUser)) {
                return "{ 'hash':" . $realUser['Conductor']['hash_sesion_conductor'] . ", 'update_time':" . Configure::read('Rastreo.update_time') . ", 'id_bus':" . $realBus['Bus']['id_bus'] . ", 'id_conductor':" . $realUser['Conductor']['id_conductor'] . "}";
            } else {
                return 1;
            }
        }
        return 0;
    }

    public function isLoggedIn($hash) {
        if (empty($hash)) {
            return false;
        }

        $conductor = $this->find('first', array(
            'conditions' => array(
                'Conductor.estado_conductor' => 'activo',
                'Conductor.hash_sesion_conductor' => $hash
            ),
        ));

        if (!empty($conductor)) {
            if ($conductor["Conductor"]["hash_sesion_conductor"] != null && $conductor["Conductor"]["fecha_ultima_sesion_conductor"] != null && strtotime($conductor["Conductor"]["fecha_ultima_sesion_conductor"]) < strtotime("-" . Configure::read('Conductores.session_timeout') . " minutes")) {
                $conductor["Conductor"]["hash_sesion_conductor"] = null;
                unset($conductor['Conductor']['clave_conductor']);
                $this->save($conductor);
                $conductor = array();
            }
        }

        return $conductor;
    }

    public function logout($hash) {
        if (empty($hash)) {
            return false;
        }

        $realUser = $this->find('first', array(
            'conditions' => array(
                'Conductor.estado_conductor' => 'activo',
                'Conductor.hash_sesion_conductor' => $hash
            ),
        ));

        if (!empty($realUser)) {
            unset($realUser['Conductor']['clave_conductor']);
            $realUser['Conductor']['hash_sesion_conductor'] = null;
            if ($this->save($realUser)) {
                return 1;
            }
        }

        return 0;
    }

}

?>